home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / DEMO / WDWLISTS.M < prev   
Encoding:
Text File  |  1991-04-16  |  7.4 KB  |  288 lines

  1. MODULE WLTest;
  2.  
  3. (*
  4.  * Dies Modul demonstiert die Anwendung des Moduls "WindowLists", das
  5.  * auf bequeme Weise Listen in Fenstern verwaltet.
  6.  *)
  7.  
  8. FROM SYSTEM IMPORT ADDRESS,
  9.                    ADR;
  10.  
  11. FROM InOut IMPORT WriteCard, WriteLn, WriteString;
  12.  
  13. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  14.  
  15. FROM Strings IMPORT String, Relation,
  16.                     Empty, Append, Assign, Concat, Length, PosLen, Delete,
  17.                     Compare;
  18.  
  19. IMPORT FastStrings;
  20.  
  21. FROM Lists IMPORT List,
  22.                   ResetList, PrevEntry, DeleteList, CreateList, AppendEntry,
  23.                   NoOfEntries, RemoveEntry, CurrentEntry, InsertEntry,
  24.                   NextEntry;
  25.  
  26. FROM Directory IMPORT DirEntry, FileAttr, FileAttrSet, DirQuery;
  27.  
  28. FROM FileNames IMPORT SplitPath, ConcatPath;
  29.  
  30. FROM GrafBase IMPORT Point, Rectangle,
  31.                      Rect;
  32.  
  33. FROM GEMGlobals IMPORT GemChar, MouseButton, MButtonSet, SpecialKeySet, MaxStr;
  34.  
  35. FROM AESEvents IMPORT RectEnterMode, Event;
  36.  
  37. FROM EventHandler IMPORT EventProc,
  38.                          HandleEvents;
  39.  
  40. FROM WindowLists IMPORT WindowList, NoWindowList, DetectModeWL, AttributesWL,
  41.                         AttributeWL, MaxWindowWL, CenterWindowWL, ErrorStateWL,
  42.                         CreateWL, DeleteWL, SetListWL, GetListWL,
  43.                         ShowWindowWL, HideWindowWL, DetectWindowWL,
  44.                         SetEntryAttributesWL, EntryAttributesWL, StateWL;
  45.  
  46.  
  47. TYPE    PtrWEnv = POINTER TO RECORD
  48.                     path        : String;
  49.                     wl          : WindowList;
  50.                   END;
  51.         
  52.         Entry   = POINTER TO DirEntry;
  53.  
  54.  
  55. VAR     WEnv    : PtrWEnv;
  56.         
  57.         Worker  : ARRAY [0..1] OF EventProc;
  58.         
  59.         Success,
  60.         Quit    : BOOLEAN;
  61.         
  62.         VoidO   : BOOLEAN;
  63.  
  64.  
  65. FORWARD EntryToStr (entry, env: ADDRESS; VAR str: MaxStr);
  66.  
  67. FORWARD CloseWList (wl: WindowList; env: ADDRESS);
  68.  
  69. FORWARD OpenFolder (wl: WindowList; env, entry: ADDRESS; selMode: LONGCARD);
  70.  
  71.  
  72. VAR     CurrList        : List;
  73.  
  74. PROCEDURE InsertEntryInCurr (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  75.  
  76.   VAR   data: Entry;
  77.         e   : Entry;
  78.         subdir,
  79.         ins : BOOLEAN;
  80.  
  81.   BEGIN
  82.     IF (entry.name [0] # '.') THEN
  83.     
  84.       NEW (data);
  85.       data^ := entry;
  86.       subdir:= subdirAttr IN data^.attr;
  87.  
  88.       (*  alphabetic order, folders first
  89.        *)
  90.        
  91.       ResetList (CurrList);
  92.       LOOP
  93.         e := NextEntry (CurrList);
  94.         IF e = NIL THEN
  95.           AppendEntry (CurrList, data, VoidO); EXIT
  96.         ELSE
  97.           ins := subdir AND NOT (subdirAttr IN e^.attr);
  98.           IF ~ ins AND (data^.attr = e^.attr) THEN
  99.             ins := (Compare (data^.name, e^.name) = less);
  100.           END;
  101.           IF ins THEN
  102.             e := PrevEntry (CurrList);
  103.             InsertEntry (CurrList, data, VoidO);
  104.             EXIT
  105.           END;
  106.         END;
  107.       END;
  108.     
  109.     END;
  110.       
  111.     RETURN TRUE
  112.   END InsertEntryInCurr;
  113.   
  114.  
  115. PROCEDURE newList (wEnvPtr: PtrWEnv);
  116.  
  117.   VAR   res     : INTEGER;
  118.         wildName: String;
  119.  
  120.   BEGIN
  121.     ConcatPath (wEnvPtr^.path, '*.*', wildName);
  122.     CreateList (CurrList, VoidO);
  123.     DirQuery (wildName, FileAttrSet{subdirAttr}, InsertEntryInCurr, res);
  124.     SetListWL (wEnvPtr^.wl, CurrList, EntryToStr, CloseWList, OpenFolder,
  125.                wEnvPtr, 16, wEnvPtr^.path);
  126.   END newList;
  127.  
  128. PROCEDURE killList (wEnvPtr: PtrWEnv);
  129.  
  130.   VAR   l       : List;
  131.         entry   : Entry;
  132.  
  133.   BEGIN
  134.     GetListWL (wEnvPtr^.wl, l);
  135.     
  136.     ResetList (l);
  137.     entry := PrevEntry (l);
  138.     WHILE entry # NIL DO
  139.       RemoveEntry (l, VoidO);
  140.       DISPOSE (entry);
  141.       entry := CurrentEntry (l);
  142.     END;
  143.     DeleteList (l, VoidO);
  144.     IF VoidO THEN HALT END;
  145.   END killList;
  146.   
  147.   
  148. PROCEDURE EntryToStr (entry, env: ADDRESS; VAR str: MaxStr);
  149.  
  150.   VAR   data    : Entry;
  151.  
  152.   BEGIN
  153.     data := Entry (entry);
  154.     
  155.     IF subdirAttr IN data^.attr THEN
  156.       Assign (' '+7C, str, VoidO)
  157.     ELSE
  158.       Assign ('  ', str, VoidO);
  159.     END;
  160.     Append (' ', str, VoidO);
  161.     FastStrings.Append (data^.name, str);
  162.     Append (' ', str, VoidO);
  163.   END EntryToStr;
  164.  
  165. PROCEDURE CloseWList (wl: WindowList; env: ADDRESS);
  166.  
  167.   VAR   wEnv: PtrWEnv;
  168.         i, j,
  169.         len : INTEGER;
  170.         folderName: String;
  171.  
  172.   BEGIN
  173.     wEnv := PtrWEnv (env);
  174.     
  175.     WITH wEnv^ DO
  176.       killList (wEnv);
  177.       
  178.       (* Prüfen ob Root-Dir oder Ordner geöffnet ist. *)
  179.        
  180.       (*  Der Pfadname ist immer mit einem '\' abgeschlossen,
  181.        *  deshalb kann einfach das letzte Zeichen entfernt werden. *)
  182.       Delete (path, Length (path)-1, 1, VoidO);
  183.       SplitPath (path, path, folderName);
  184.  
  185.       IF Empty (folderName) THEN
  186.       
  187.         (* Wir waren im Root -> Fenster schließen *)
  188.         path := '';
  189.         HideWindowWL (wl);
  190.         
  191.       ELSE
  192.         
  193.         (* Vorigen Ordner anzeigen *)
  194.         (*  ('path' enthält schon neuen Namen) *)
  195.         newList (wEnv);
  196.         
  197.       END;
  198.     END;
  199.   END CloseWList;
  200.   
  201. PROCEDURE OpenFolder (wl: WindowList; entry, env: ADDRESS; selMode: LONGCARD);
  202.  
  203.   VAR   wEnvPtr : PtrWEnv;
  204.         data    : Entry;
  205.         attrs   : AttributesWL;
  206.  
  207.   BEGIN
  208.     wEnvPtr := PtrWEnv (env);
  209.     data := Entry (entry);
  210.     
  211.     attrs := EntryAttributesWL (wl, entry);
  212.     IF selectedWL IN attrs THEN EXCL (attrs, selectedWL)
  213.     ELSE INCL (attrs, selectedWL) END;
  214.     SetEntryAttributesWL (wl, entry, attrs);
  215.     
  216.     IF subdirAttr IN data^.attr THEN
  217.       killList (wEnvPtr);
  218.       Append (data^.name, wEnvPtr^.path, VoidO);
  219.       Append ('\', wEnvPtr^.path, VoidO);
  220.       newList (wEnvPtr);
  221.     END;
  222.   END OpenFolder;
  223.   
  224.  
  225.   
  226. PROCEDURE KeyHdler (VAR ch: GemChar; VAR k: SpecialKeySet): BOOLEAN;
  227.  
  228.   BEGIN
  229.     IF CAP (ch.ascii) = 'Q' THEN Quit := TRUE
  230.     ELSIF (CAP (ch.ascii) >= 'A') AND (CAP (ch.ascii) <= 'P') THEN
  231.       WITH WEnv^ DO
  232.         IF Empty (path) THEN
  233.           Append (CAP (ch.ascii), WEnv^.path, VoidO);
  234.           Append (':\', path, VoidO);
  235.           newList (WEnv);
  236.           ShowWindowWL (wl);
  237.         END;
  238.       END
  239.     END;
  240.     RETURN FALSE
  241.   END KeyHdler;
  242.  
  243. PROCEDURE ButHdler (clicks: CARDINAL; loc: Point; buts: MButtonSet;
  244.                     keys: SpecialKeySet): BOOLEAN;
  245.  
  246.   VAR   wl   : WindowList;
  247.         entry,
  248.         env  : ADDRESS;
  249.  
  250.   BEGIN
  251.     DetectWindowWL (WEnv^.wl, 0, loc, selectWL, 0L, wl, entry, env, VoidO);
  252.     RETURN FALSE
  253.   END ButHdler;
  254.   
  255.   
  256. BEGIN
  257.   NEW (WEnv);
  258.   CreateWL (WEnv^.wl, TRUE,  Rect (CenterWindowWL, CenterWindowWL,
  259.                                    MaxWindowWL, MaxWindowWL));
  260.   IF StateWL (WEnv^.wl) = okWL THEN
  261.     WEnv^.path := '';
  262.     
  263.     WriteString ('Demo zum Modul "WindowLists"');
  264.     WriteLn;
  265.     WriteString ("Drücke 'Q' zum Beenden,");
  266.     WriteLn;
  267.     WriteString ("Laufwerksbuchstaben ('A'-'P'), um Fenster zu öffnen");
  268.     WriteLn;
  269.     
  270.     Worker[0].event := keyboard;
  271.     Worker[0].keyHdler := KeyHdler;
  272.     Worker[1].event := mouseButton;
  273.     Worker[1].butHdler := ButHdler;
  274.     Quit := FALSE;
  275.     REPEAT
  276.       HandleEvents (2, MButtonSet{msBut1}, MButtonSet{msBut1},
  277.                     lookForEntry, Rect (0,0,0,0),
  278.                     lookForEntry, Rect (0,0,0,0),
  279.                     0L,
  280.                     Worker, 0);
  281.     UNTIL Quit;
  282.     
  283.     IF ~ Empty (WEnv^.path) THEN killList (WEnv) END;
  284.     DeleteWL (WEnv^.wl);
  285.   END;
  286.   DISPOSE (WEnv);
  287. END WLTest.
  288.